package com.dyrj.ysk.controller;

import com.alibaba.fastjson.JSON;
import com.dyrj.pig.bean.TYhk;
import com.dyrj.pig.bean.TYhkExample;
import com.dyrj.pig.dao.TYhkMapper;
import com.dyrj.ysk.configuration.SdkProperties;
import com.dyrj.ysk.constants.*;
import com.dyrj.ysk.util.FakeDataUtil;
import com.dyrj.ysk.util.JsonUtil;
import com.pabank.sdk.PABankSDK;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 后台交易控制类
 * @author 吴侠志  2019/11/6
 * @version 1.0
 */
@Slf4j
@RestController
@RequestMapping("/ysksdk/backTrade")
public class BackStageTradeController {
    @Resource
    private SdkProperties sdkProperties;
    @Resource
    private TYhkMapper tYhkMapper;

    /**
     * CLOUDPAY5001
     * 后台资金类交易 支付接口
     * @return
     */
    @RequestMapping(value = "/pay",method = RequestMethod.GET)
    public Map<String,Object> pay() throws IOException {
        /**
         * TraderNo,TraderOrderNo,StoreId,OrderSendTime,OrderName,CashierNo,PayModeNo,Scene,AuthCode,
         * TranAmt,CallBackNoticeUrl,FrontSkipUrl,OrderRemark,PayLimit,RealNamePay,MessageCheckCode,
         * BindCardNo,ClientNo,DeductSignNo,SubTraderPublicId,UserSubId,PayerName,GlobalId,GoodsMsg,ExtParameter
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 商户订单号 商户系统生成的订单号，需要保证在商户系统唯一
        reqParam.put("TraderOrderNo",FakeDataUtil.randomTraderOrderNo());
        //非必填 门店编号
        reqParam.put("StoreId",null);
        //必填 订单发送时间 格式：yyyyMMddHHmmss  支付方式为FastPay时需与发送短信接口订单发送时间一致
        reqParam.put("OrderSendTime",FakeDataUtil.orderSendTimeNow());
        //非必填 订单名称
        reqParam.put("OrderName","一笔订单");
        //非必填 收银员编号
        reqParam.put("CashierNo",null);
        //必填 支付方式编号
        reqParam.put("PayModeNo", PayModeNo.ALIPAY_NATIVE.getCode());
        //非必填 场景
        reqParam.put("Scene", null);
        //非必填 授权码 仅当支付方式编号为WeixinMicropay或AlipayMicropay的时候必填
        reqParam.put("AuthCode","");
        //必填 交易金额 单位：分
        reqParam.put("TranAmt","1");
        //非必填 回调通知URL
        reqParam.put("CallBackNoticeUrl",FakeDataUtil.callBackNoticeUrl());
        //非必填 前端跳转URL
        reqParam.put("FrontSkipUrl",FakeDataUtil.frontSkipUrl());
        //非必填 订单备注  详见《Remark字段填写补充说明.docx》
        reqParam.put("OrderRemark",FakeDataUtil.orderRemark());
        //非必填 支付限制 当值为limit_pay=no_credit时，表示微信支付限制用户不能使用信用卡支付
        reqParam.put("PayLimit",null);
        //非必填 实名支付 用于公安和保险类商户使用，该字段为JSON对象数据，包含类型、证件号、姓名三个子域
        //  例如 ： {“type”:”IDCARD”,”number”:”421”,”name”:”张三”}
        reqParam.put("RealNamePay",null);
        //非必填 短信验证码  固定6位数字，仅当支付方式为FastPay时必填
        reqParam.put("MessageCheckCode",null);
        //非必填 绑卡编号 商户在云收款系统的绑卡编号,支付方式为FastPay 时必填,支付方式为FastPay 时需与发送短信接口绑卡编号一致
        reqParam.put("BindCardNo",null);
        //非必填 客户号 商户自己客户体系唯一标识,支付方式为FastPay 时必填,支付方式为FastPay 时需与发送短信接口客户号一致
        reqParam.put("ClientNo",null);
        //非必填 代扣签约编号 代扣商户，签约接口返回
        reqParam.put("DeductSignNo",null);
        //非必填 微信分配的子商户公众账号ID  WeixinJsapi,WeixinProgram，WeixinApp必填
        reqParam.put("SubTraderPublicId",null);
        //非必填 用户子标识
        reqParam.put("UserSubId",null);
        //非必填 付款人姓名
        reqParam.put("PayerName",null);
        //非必填 证件号
        reqParam.put("GlobalId",null);
        //非必填 商品信息
        reqParam.put("GoodsMsg",null);
        //非必填 扩展参数
        reqParam.put("ExtParameter",null);
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"Pay");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }

    /**
     * CLOUDPAY5002
     * 查询交易 查询单笔订单
     */
    @RequestMapping(value = "/querySingleOrder",method = RequestMethod.GET)
    public Map<String,Object> querySingleOrder() throws IOException {
        /**
         * TraderNo,TraderOrderNo,OrderSendTime
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 商户订单号 商户系统生成的订单号，需要保证在商户系统唯一
        reqParam.put("TraderOrderNo",FakeDataUtil.oldOrderNo());
        //必填 订单发送时间 格式：yyyyMMddHHmmss
        reqParam.put("OrderSendTime",FakeDataUtil.oldOrderSendTime());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"QuerySingleOrder");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5003
     * 后台资金类交易 撤销订单
     */
    @RequestMapping(value = "/revokeOrder",method = RequestMethod.GET)
    public Map<String,Object> revokeOrder() throws IOException {
        /**
         * TraderNo,OldOrderNo,OldOrderSendTime,CashierNo,CancelRemark
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 原商户订单号
        reqParam.put("OldMerOrderNo",FakeDataUtil.oldOrderNo());
        //必填 原订单发送时间 格式：yyyyMMddHHmmss
        reqParam.put("OldOrderSendTime",FakeDataUtil.oldOrderSendTime());
        //非必填 收银员编号
        reqParam.put("CashierNo",null);
        //非必填 撤销备注
        reqParam.put("CancelRemark",null);
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"RevokeOrder");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5004
     * 后台资金类交易 申请退款
     */
    @RequestMapping(value = "/applyRefund",method = RequestMethod.GET)
    public Map<String,Object> applyRefund() throws IOException {
        /**
         * TraderNo,ReturnOrderNo,OldOrderNo,OldOrderSendTime,ReturnOrderSendTime,CashierNo,ReturnAmt,RefundRemark
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 退款订单号 商户系统生成的订单号，需要保证在商户系统唯一
        reqParam.put("ReturnOrderNo",FakeDataUtil.randomTraderOrderNo());
        //必填 原商户订单号
        reqParam.put("OldMerOrderNo",FakeDataUtil.oldOrderNo());
        //必填 原订单发送时间 格式：yyyyMMddHHmmss
        reqParam.put("OldOrderSendTime",FakeDataUtil.oldOrderSendTime());
        //必填 退款订单发送时间 格式：yyyyMMddHHmmss
        reqParam.put("ReturnOrderSendTime",FakeDataUtil.orderSendTimeNow());
        //非必填 收银员编号
        reqParam.put("CashierNo",null);
        //必填 退款金额
        reqParam.put("ReturnAmt","1");
        //非必填 退款备注 见证退款则必填
        reqParam.put("RefundRemark",FakeDataUtil.refundRemark());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"ApplyRefund");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5005
     * 查询交易 查询单笔退款
     */
    @RequestMapping(value = "/querySingleRefund",method = RequestMethod.GET)
    public Map<String,Object> querySingleRefund() throws IOException {
        /**
         * TraderNo,ReturnOrderNo,ReturnOrderSendTime
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 退款订单号 商户系统生成的订单号，需要保证在商户系统唯一
        reqParam.put("ReturnOrderNo",FakeDataUtil.returnOrderNo());
        //必填 退款订单发送时间 格式：yyyyMMddHHmmss
        reqParam.put("ReturnOrderSendTime",FakeDataUtil.returnOrderSendTime());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"QuerySingleRefund");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }

    /**
     * CLOUDPAY5006
     * 查询交易 查询绑卡列表
     */
    @RequestMapping(value = "/queryBankCardList",method = RequestMethod.GET)
    public Map<String,Object> queryBankCardList() throws IOException {
        /**
         * TraderNo,ClientNo
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 客户号 商户自己客户体系唯一标识
        reqParam.put("ClientNo",FakeDataUtil.clientNo());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"QueryBankCardList");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }

    /**
     * CLOUDPAY5007
     * 后台非资金类交易 解绑银行卡
     */
    @RequestMapping(value = "/untyingBankCard",method = RequestMethod.GET)
    public Map<String,Object> untyingBankCard(HttpServletRequest request) throws IOException {
        String membercode = request.getParameter("membercode")==null ? "" : request.getParameter("membercode");
        String bindcardno = request.getParameter("bindcardno")==null ? "" : request.getParameter("bindcardno");

        /**
         * TraderNo,ClientNo,BindCardNo
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 客户号 商户自己客户体系唯一标识
        reqParam.put("ClientNo",membercode);
        //必填 绑卡编号
//        reqParam.put("BindCardNo",FakeDataUtil.bindCardNo());
        reqParam.put("BindCardNo",bindcardno);
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"UntyingBankCard");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        //{"TxnReturnCode":"T7614","TxnReturnMsg":"银行卡已解除绑定","CnsmrSeqNo":"O10556200913XHJ9KLXclX"}
        if("T0000".equals(returnMap.get("TxnReturnCode"))){
            try{
                //根据 membercode，yhkh 查询用户绑定的银行卡，删除绑卡信息。
                TYhkExample tYhkExample = new TYhkExample();
                TYhkExample.Criteria tYhkcriteria = tYhkExample.createCriteria();
                tYhkcriteria.andMembercodeEqualTo(membercode);
                tYhkcriteria.andBindcardnoEqualTo(bindcardno);
                TYhk tYhk_update = new TYhk();
                tYhk_update.setBdzt(3);//绑定状态（0：未绑定，1：绑定成功，2：绑定失败，3：解绑成功，4：解绑失败）
                tYhkMapper.updateByExampleSelective(tYhk_update, tYhkExample);
//        tYhkMapper.deleteByExample(tYhkExample);
            }catch (Exception e){
                e.printStackTrace();
            }
        }else{
//            try{
//                //根据 membercode，yhkh 查询用户绑定的银行卡，删除绑卡信息。
//                TYhkExample tYhkExample = new TYhkExample();
//                TYhkExample.Criteria tYhkcriteria = tYhkExample.createCriteria();
//                tYhkcriteria.andMembercodeEqualTo(membercode);
//                tYhkcriteria.andYhkhEqualTo(bindcardno);
//                TYhk tYhk_update = new TYhk();
//                tYhk_update.setBdzt(4);//绑定状态（0：未绑定，1：绑定成功，2：绑定失败，3：解绑成功，4：解绑失败）
//                tYhk_update.setBz(returnMap.get("TxnReturnMsg").toString());
//                tYhk_update.setUpdatetime(new Date());
//                tYhkMapper.updateByExampleSelective(tYhk_update, tYhkExample);
//            }catch (Exception e){
//                e.printStackTrace();
//            }
        }

        return returnMap;
    }
    /**
     * CLOUDPAY5008
     * 后台非资金类交易 发送短信
     */
    @RequestMapping(value = "/sendShortMessage",method = RequestMethod.GET)
    public Map<String,Object> sendShortMessage() throws IOException {
        /**
         * TraderNo,TraderOrderNo,OrderSendTime,TranAmt,BindCardNo,ClientNo
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 商户订单号 商户系统生成的订单号，需要保证在商户系统唯一
        reqParam.put("TraderOrderNo",FakeDataUtil.randomTraderOrderNo());
        //必填 订单发送时间 格式：yyyyMMddHHmmss
        reqParam.put("OrderSendTime",FakeDataUtil.orderSendTimeNow());
        //必填 交易金额 单位：分
        reqParam.put("TranAmt","20");
        //必填 绑卡编号
        reqParam.put("BindCardNo",FakeDataUtil.bindCardNo());
        //必填 客户号 商户自己客户体系唯一标识
        reqParam.put("ClientNo",FakeDataUtil.clientNo());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"SendShortMessage");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5009
     * 后台非资金类交易 微信公众号配置
     */
    @RequestMapping(value = "/wechatSubscriptionConfigure",method = RequestMethod.GET)
    public Map<String,Object> wechatSubscriptionConfigure() throws IOException {
        /**
         * TraderNo,PayModeNo,SceneCode,ConfigurationType,TraderPublicNo,PayAuthCatalog,AttentionPublicNoAppId,
         * PayMiniProgramAppId
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 支付方式编号 WeixinJsapi、WeixinProgram
        reqParam.put("PayModeNo",PayModeNo.WEIXIN_MICROPAY.getCode());
        //非必填 场景码
        reqParam.put("SceneCode", Scene.OFFLINE.getCode());
        //必填 配置类型 1.配置绑定sub_appid  2.配置支付授权目录  3.配置推荐关注
        reqParam.put("ConfigurationType", ConfigurationType.TYPE1.getCode());
        //非必填 商户公众号/小程序appid  配置关联公众号appid(绑定subAppid接口传)
        reqParam.put("TraderPublicNo",FakeDataUtil.traderPublicNo());
        //非必填 支付授权目录 银行特约商户公众账号JS API支付授权目录 ，要求符合URI格式规范，每次添加一个支付目录，最多5个(配置支付目录传)
        reqParam.put("PayAuthCatalog",null);
        //非必填 配置推荐关注公众号appid  特约商户或渠道的公众号APPID(公众号配置推荐关注传)
        reqParam.put("AttentionPublicNoAppId",null);
        //非必填 支付凭证推荐小程序appid 需为通过微信认证的小程序appid，且认证主体与渠道商或子商户一致(小程序配置推荐关注传)
        reqParam.put("PayMiniProgramAppId",null);
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"WechatSubscriptionConfigure");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5010
     * 后台非资金类交易 申请代扣签约
     */
    @RequestMapping(value = "/applyWithholdSignature",method = RequestMethod.GET)
    public Map<String,Object> applyWithholdSignature() throws IOException {
        /**
         * TraderNo,PayerAcctOpenBranchId,SignSeqNo,PayerAcctNo,PayerAcctName,PayerGlobalId,PayerReserverMobile,
         * PayerGlobalType
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 付款人开户行号
        reqParam.put("PayerAcctOpenBranchId", PayerAcctOpenBranchId.ID_12.getCode());
        //必填 签约流水号
        reqParam.put("SignSeqNo",FakeDataUtil.randomSignSeqNo());
        //必填 付款人账号
        reqParam.put("PayerAcctNo",FakeDataUtil.payerAcctNo());
        //必填 付款人户名
        reqParam.put("PayerAcctName",FakeDataUtil.payerAcctName());
        //必填 付款人证件号码
        reqParam.put("PayerGlobalId",FakeDataUtil.payerGlobalId());
        //必填 付款人预留手机号码
        reqParam.put("PayerReserverMobile",FakeDataUtil.payerReserverMobile());
        //必填 付款人证件类型
        reqParam.put("PayerGlobalType", PayerGlobalType.ID.getCode());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"ApplyWithholdSignature");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5011
     * 后台非资金类交易 确认代扣签约
     */
    @RequestMapping(value = "/confirmWithholdSignature",method = RequestMethod.GET)
    public Map<String,Object> confirmWithholdSignature() throws IOException {
        /**
         * TraderNo,SignNo,CertificateMsg
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 签约编号
        reqParam.put("SignNo",FakeDataUtil.signNo());
        reqParam.put("CertificateMsg","123456");
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"ConfirmWithholdSignature");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5012
     * 查询交易 查询代扣签约
     */
    @RequestMapping(value = "/queryWithholdSignature",method = RequestMethod.GET)
    public Map<String,Object> queryWithholdSignature() throws IOException {
        /**
         * TraderNo,SignNo
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 签约编号
        reqParam.put("SignNo",FakeDataUtil.signNo());
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"QueryWithholdSignature");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
    /**
     * CLOUDPAY5013
     * 查询交易 下载对账单
     * @return
     */
    @RequestMapping(value = "/downloadReconciliationFile",method = RequestMethod.GET)
    public Map<String,Object> downloadReconciliationFile() throws IOException {
        /**
         * TraderNo,ReconcileDate
         */
        // 指定配置文件的路径
        PABankSDK.init("conf/config.properties");
        // 验证开发者
        PABankSDK.getInstance().approveDev();
        Map<String,String> reqParam=new HashMap<>();
        //必填 系统流水号（CnsmrSeqNo）规范：6位uid(文件传输用户短号)+6位系统日期(YYMMDD)+10位随机数
        reqParam.put("CnsmrSeqNo", FakeDataUtil.randomCnsmrSeqNo(sdkProperties.getUid()));
        //必填 商户编号
        reqParam.put("TraderNo",sdkProperties.getBusinessId());
        //必填 对账日期 格式：yyyyMMdd
        reqParam.put("ReconcileDate",FakeDataUtil.reconcileDate(2));
        String req=JsonUtil.objectToJson(reqParam);
        log.info("req:"+req);
        // b.交易测试，传入参数服务ID(此处服务ID为示例，需根据调用接口配置为对应服务ID,服务ID在接口文档中查看)，JSON报文流水号字段需传入22位
        Map<String, Object> returnMap= PABankSDK.getInstance().apiInter(req,"DownloadReconciliationFile");
        log.info("returnMap:"+JSON.toJSONString(returnMap));
        return returnMap;
    }
}
